#获取人脸特征点的数据
#将人脸表情划分完成之后，将数据写入到数据集的labels文件夹下的txt文档中
#每张图片对应一个labels文件夹下的txt文档
#txt文档说明：以图像的左上角为(0,0)点计算x_center y_center width height的值
#class x_center y_center width height
#第一列是class名，比如微笑是0，则class改为0，剩余四项是 x_center y_center width height
#YOLO 是目标检测，如果我个人理解没有错误的话，那么分类成几个类别，一样会检测出来是否是微笑等
#不，是你理解错了——2022年2月24日
#此处能得到人脸图像的方框数值

import cv2
import dlib
import os
import sys
import time

output_dir = "not_cut_labels"
origin_dir = "cut_frames"
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

def save2text(txt_filename,data):#txt_filename时写入的文件名，data是要写入的数据
    file = open(txt_filename,'a')
    file.write(data)
    #time.sleep(0.1)
    file.close()
# 使用训练好的68个特征点模型
predictor_path = "shape_predictor_68_face_landmarks.dat"
predictor = dlib.shape_predictor(predictor_path)

# 正向人脸检测器将图像
detector = dlib.get_frontal_face_detector()

for filenames in os.listdir(origin_dir):
    # 读取图片
    img = cv2.imread(origin_dir + '/' +filenames)
    width = img.shape[1]#帧图像的长度，就是水平长度
    height = img.shape[0]#帧图像的高度，就是纵向长度
    #print(img.shape[1],img.shape[0])#width = img.shape[1]#帧图像的长度，就是水平长度，height = img.shape[0]#帧图像的高度，就是纵向长度
    # 转换为灰阶图片
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 使用检测器来检测图像中的人脸
    faces = detector(gray, 1)
    # 打印结果
    time.sleep(0.1)
    #print("人脸数: ", len(faces))
    if (len(faces))!=0:
        for i, face in enumerate(faces):
            print("第", i+1, "个人脸的矩形框坐标：\n","left:", face.left(), "right:", face.right(), "top:", face.top(), "bottom:", face.bottom())
            # 获取人脸特征点
            shape = predictor(img, face)
            print("第", i+1, '个人脸特征点:')
            print(shape.parts())

            x_center = float('%.6f' % ((face.left() + 0.5*(face.right() - face.left()))/width))
            y_center = float('%.6f' %((face.top() + 0.5*(face.bottom() - face.top()))/height))
            face_width = float('%.6f' %((face.right() - face.left())/width))
            face_height = float('%.6f' %((face.bottom() - face.top())/height))

            save2text(filenames, str(0))
            save2text(filenames, str(" "))
            save2text(filenames, str(x_center))
            save2text(filenames, str(" "))
            save2text(filenames, str(y_center))
            save2text(filenames, str(" "))
            save2text(filenames, str(face_width))
            save2text(filenames, str(" "))
            save2text(filenames, str(face_height))
            save2text(filenames, str("\n"))
            i=i+1
    else:
        os.remove(origin_dir + '/' +filenames)